import { useI18n as vueUseI18n } from 'vue-i18n'
import { i18n } from '@/plugins/vueI18n'
import { getCurrentInstance } from 'vue'

type I18nGlobalTranslation = {
  (key: string): string
  (key: string, locale: string): string
  (key: string, locale: string, list: unknown[]): string
  (key: string, locale: string, named: Record<string, unknown>): string
  (key: string, list: unknown[]): string
  (key: string, named: Record<string, unknown>): string
}

type I18nTranslationRestParameters = [string, any]

const getKey = (namespace: string | undefined, key: string) => {
  if (!namespace) {
    return key
  }
  if (key.startsWith(namespace)) {
    return key
  }
  return `${namespace}.${key}`
}

export const useI18n = (
  namespace?: string
): {
  t: I18nGlobalTranslation
} => {
  // 检查是否在组件的 setup 上下文中
  const instance = getCurrentInstance()

  // 如果在组件上下文中，使用 composition API
  if (instance) {
    try {
      const { t: vueT, ...methods } = vueUseI18n()

      const tFn: I18nGlobalTranslation = (key: string, ...arg: any[]) => {
        if (!key) return ''

        const translatedKey = getKey(namespace, key)

        // 直接使用 vue-i18n 的 t 函数
        const result = (vueT as any)(translatedKey, ...(arg as I18nTranslationRestParameters))

        // 只在开发环境下且翻译失败时才打印警告
        // if (import.meta.env.DEV && result === translatedKey) {
        //   console.warn(`[Component] Translation not found for key: ${translatedKey}`)
        // }

        return result
      }

      return {
        ...methods,
        t: tFn
      }
    } catch (error) {
      // 如果 vue-i18n 还未初始化，返回一个延迟翻译函数
      return {
        t: (key: string) => {
          // 返回 key 本身，避免报错
          return getKey(namespace, key)
        }
      }
    }
  }

  // 如果不在组件上下文中，使用全局 i18n 实例或返回 key
  const normalFn = {
    t: (key: string, ...arg: any[]) => {
      if (!key) return ''

      const translatedKey = getKey(namespace, key)

      // 如果 i18n 未初始化，返回 key 本身
      if (!i18n || !i18n.global) {
        // 不再打印警告，避免控制台污染
        return translatedKey
      }

      try {
        const result = (i18n.global.t as any)(
          translatedKey,
          ...(arg as I18nTranslationRestParameters)
        )

        // 移除或注释掉警告，避免控制台污染
        // if (import.meta.env.DEV && result === translatedKey) {
        //   console.warn(`Translation not found for key: ${translatedKey}`)
        // }

        return result
      } catch (error) {
        // 如果翻译失败，返回 key
        return translatedKey
      }
    }
  }

  return normalFn
}

export const t = (key: string) => key
